package com.dimples.dd.system.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dimples.dd.common.enums.CommonStatusEnum;
import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.mybatis.core.mapper.BaseMapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.model.bo.SimpleUserBO;
import com.dimples.dd.system.model.bo.UserBO;
import com.dimples.dd.system.model.bo.UserFormBO;
import com.dimples.dd.system.model.entity.SystemDeptDO;
import com.dimples.dd.system.model.entity.SystemRoleDO;
import com.dimples.dd.system.model.entity.SystemUserRoleDO;
import com.dimples.dd.system.model.entity.SystemUsersDO;
import com.dimples.dd.system.model.query.UserPageQuery;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface SystemUsersMapper extends BaseMapperX<SystemUsersDO> {

    /**
     * 根据用户名获取认证信息
     *
     * @param username 用户名
     * @return {@link SystemUsersDO}
     */
    default SystemUsersDO findByName(String username) {
        MPJLambdaWrapperX<SystemUsersDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.select(SystemUsersDO::getId
                , SystemUsersDO::getUsername
                , SystemUsersDO::getNickname
                , SystemUsersDO::getPassword
                , SystemUsersDO::getStatus
                , SystemUsersDO::getDeptId
                , SystemUsersDO::getAvatar
                , SystemUsersDO::getMobile
                , SystemUsersDO::getEmail);
        wrapperX.selectCollection(SystemRoleDO.class, SystemUsersDO::getRoles, map -> map.result(SystemRoleDO::getCode));
        wrapperX
                .leftJoin(SystemUserRoleDO.class, SystemUserRoleDO::getUserId, SystemUsersDO::getId)
                .leftJoin(SystemRoleDO.class, SystemRoleDO::getId, SystemUserRoleDO::getRoleId);
        wrapperX.eqIfPresent(SystemUsersDO::getUsername, username);
        return this.selectJoinOne(SystemUsersDO.class, wrapperX);
    }

    /**
     * 查找用户详细信息
     *
     * @param page          分页对象
     * @param userPageQuery 用户对象，用于传递查询条件
     * @return Page
     */
    default Page<UserBO> getUserPage(Page<UserBO> page, UserPageQuery userPageQuery) {
        MPJLambdaWrapperX<SystemUsersDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.select(SystemUsersDO::getId
                , SystemUsersDO::getUsername
                , SystemUsersDO::getNickname
                , SystemUsersDO::getEmail
                , SystemUsersDO::getMobile
                , SystemUsersDO::getStatus
                , SystemUsersDO::getCreateTime
                , SystemUsersDO::getGender
                , SystemUsersDO::getDeptId
                , SystemUsersDO::getLoginDate
                , SystemUsersDO::getUpdateTime
                , SystemUsersDO::getRemark
                , SystemUsersDO::getAvatar
        );
        wrapperX.selectAs(SystemDeptDO::getName, UserBO::getDeptName);
        wrapperX.selectFunc("GROUP_CONCAT(%s)", arg -> arg.accept(SystemRoleDO::getId), UserBO::getRoleIds);
        wrapperX.selectFunc("GROUP_CONCAT(%s)", arg -> arg.accept(SystemRoleDO::getName), UserBO::getRoleNames);
        wrapperX.selectCollection(SystemRoleDO.class, UserBO::getRoles, map -> map.result(SystemRoleDO::getId));
        wrapperX
                .leftJoin(SystemUserRoleDO.class, SystemUserRoleDO::getUserId, SystemUsersDO::getId)
                .leftJoin(SystemRoleDO.class, SystemRoleDO::getId, SystemUserRoleDO::getRoleId)
                .leftJoin(SystemDeptDO.class, SystemDeptDO::getId, SystemUsersDO::getDeptId);
        wrapperX
                .eqIfPresent(SystemUsersDO::getGender, userPageQuery.getGender())
                .eqIfPresent(SystemUsersDO::getStatus, userPageQuery.getStatus())
                .eqIfPresent(SystemUsersDO::getEmail, userPageQuery.getEmail())
                .eqIfPresent(SystemUsersDO::getMobile, userPageQuery.getMobile())
                .eqIfPresent(SystemUsersDO::getNickname, userPageQuery.getNickname())
                .eqIfPresent(SystemUsersDO::getUsername, userPageQuery.getUsername())
                .inIfPresent(SystemUsersDO::getDeptId, userPageQuery.getDeptIds())
        ;
        wrapperX.groupBy(SystemUsersDO::getId, SystemUsersDO::getUsername, SystemUsersDO::getNickname, SystemUsersDO::getEmail, SystemUsersDO::getMobile, SystemUsersDO::getStatus
                , SystemUsersDO::getCreateTime, SystemUsersDO::getGender, SystemUsersDO::getDeptId, SystemUsersDO::getLoginDate, SystemUsersDO::getUpdateTime, SystemUsersDO::getRemark, SystemUsersDO::getAvatar);
        wrapperX.groupBy(SystemRoleDO::getId);

        return this.selectJoinPage(page, UserBO.class, wrapperX);
    }

    /**
     * 查询用户下拉信息分页
     *
     * @param userPageQuery 用户对象，用于传递查询条件
     * @return Page
     */
    default PageResult<SimpleUserBO> listUserOptions(UserPageQuery userPageQuery) {
        MPJLambdaWrapperX<SystemUsersDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.select(SystemUsersDO::getId, SystemUsersDO::getNickname);
        wrapperX.eq(SystemUsersDO::getStatus, CommonStatusEnum.ENABLE.getValue());
        wrapperX.likeIfPresent(SystemUsersDO::getNickname, userPageQuery.getNickname());
        wrapperX.eqIfPresent(SystemUsersDO::getId, userPageQuery.getUserId());
        return this.selectJoinPage(userPageQuery, SimpleUserBO.class, wrapperX);
    }

    /**
     * 获取用户表单详情
     *
     * @param userId 用户ID
     * @return {@link UserFormBO}
     */
    default UserFormBO getUserDetail(Long userId) {
        MPJLambdaWrapperX<SystemUsersDO> wrapperX = new MPJLambdaWrapperX<>();
        wrapperX.select(SystemUsersDO::getId, SystemUsersDO::getUsername, SystemUsersDO::getNickname, SystemUsersDO::getEmail
                , SystemUsersDO::getMobile, SystemUsersDO::getStatus, SystemUsersDO::getDeptId, SystemUsersDO::getPostIds, SystemUsersDO::getRemark
                , SystemUsersDO::getGender);
        wrapperX.selectCollection(SystemRoleDO.class, UserFormBO::getRoles, map -> map.result(SystemRoleDO::getCode))
                .leftJoin(SystemUserRoleDO.class, SystemUserRoleDO::getUserId, SystemUsersDO::getId)
                .leftJoin(SystemRoleDO.class, SystemRoleDO::getId, SystemUserRoleDO::getRoleId);
        wrapperX.eqIfPresent(SystemUsersDO::getId, userId);
        return this.selectJoinOne(UserFormBO.class, wrapperX);
    }

    /**
     * 根据状态获取用户列表
     *
     * @param status 状态
     * @return {@link List}<{@link SystemUsersDO}>
     */
    default List<SystemUsersDO> selectListByStatus(Integer status) {
        return selectList(SystemUsersDO::getStatus, status);
    }
}


























